#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
#include <QSerialPort>
#include <QSerialPortInfo>

//创建串口对象
QSerialPort serial;

//获取可用串口
QStringList serialPort_getList()
{
    QStringList list;

    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort s;
        s.setPort(info);
        if (s.open(QIODevice::ReadWrite))
        {
            list.append(s.portName());
            s.close();
        }
    }

    return list;
}

//读一次通讯数据
void MainWindow::serialPort_readAll()
{
    QByteArray buffer;

    //等待响应
    if (serial.waitForReadyRead(3000))
    {
        //等数据结束
        while(1)
        {
            buffer += serial.readAll();
            if (!serial.waitForReadyRead(20))
            {
                break;
            }
        }
    }

    qDebug() << buffer.data();
}

//槽函数-从接收缓冲区中读取数据
void MainWindow::serialPort_readyRead()
{
    QByteArray buffer = serial.readAll();
    qDebug() << "------------------------";
    qDebug() << buffer.data();
}


void MainWindow::on_pushButton_com_getList_clicked()
{
    ui->comboBox->clear();
    ui->comboBox->addItems(serialPort_getList());
}

void MainWindow::on_pushButton_com_open_clicked()
{
    //设置串口名
    serial.setPortName(ui->comboBox->currentText());
    //设置波特率
    serial.setBaudRate(QSerialPort::Baud115200);
    //设置数据位数
    serial.setDataBits(QSerialPort::Data8);
    //设置奇偶校验
    serial.setParity(QSerialPort::NoParity);
    //设置停止位
    serial.setStopBits(QSerialPort::OneStop);
    //设置流控制
    serial.setFlowControl(QSerialPort::NoFlowControl);
    //打开串口
    serial.open(QIODevice::ReadWrite);
    //清空缓存
    serial.flush();
}

void MainWindow::on_pushButton_com_send_clicked()
{
    //写读一次数据
    serial.write("pwd \n");
    serialPort_readAll();

    //使用信号槽接收数据
    QObject::connect(&serial, &QSerialPort::readyRead, this, &serialPort_readyRead);

    //在30ms内等待写就绪, 写串口
    serial.write("pwd \n");
}

void MainWindow::on_pushButton_com_close_clicked()
{
    if(serial.isOpen())
    {
        serial.close();
    }
}

